home *** CD-ROM | disk | FTP | other *** search
/ Die Ultimative Software-P…i Collection 1996 & 1997 / Die Ultimative Software-Pakete CD-ROM fur Atari Collection 1996 & 1997.iso / a / a_funk / satellit.tos / SATELLIT / SAT_SOUR.TXT / SAT_BAHN.GFA < prev   
Encoding:
Text File  |  1995-04-30  |  7.7 KB  |  278 lines

  1. bbs> Msg# 28131   To: ATARI @ALLE   From: DC1EX   Date: 23Oct89/0925
  2. Subject: SAT-BERECHNUNG IN GFA2.0
  3. Bulletin ID: 22A90CDB0GV
  4. Path: DB0AAA!DB0CZ!DB0GV
  5. de DC1EX @ DB0GV
  6.  
  7. Hallo OM's
  8.  
  9. Für alle diejenigen,  die gerne ein Satelliten-Programm schreiben
  10. möchten,  wo  es aber am geeigneten Algorithmus  scheitert  seien
  11. folgende  Routinen.  Sie stellen den Grundstock für ein  Programm
  12. dar.  Die  Routinen  dürften  weitestgehend  selbstdokumentierend
  13. sein.  Vielleicht  setzt  sich ja mal jemand  hin,  schreibt  ein
  14. brauchbares Sat-Programm und veröffentlicht es als Public-Domain.
  15.  
  16. Der Algorithmus wurde in Amsat DL 1/89 abgedruckt und stammt  von
  17. DJ1YQ. Ich habe ihn dann an Gfa-Basic 2.0 angepasst.
  18.  
  19. Die Routine ist was die Rechenzeit anbetrifft noch nicht optimal.
  20. Es  läβt sich noch eine Geschwindigkeitssteigerung von  etwa  30%
  21. erzielen.  Aus Gründen der Übersichtlichkeit habe ich mich jedoch
  22. für die langsamere Variante entschieden.
  23.  
  24. Die Routinen im einzelnen:
  25.  
  26. INIT :
  27. Initialisierung der Array's und Konstanten
  28.  
  29. START_SAT:
  30. Berechnung einiger Konstanten aus den Keplerdaten.
  31. Die  Daten ändern sich nicht in Abhängigkeit von  der  Zeit,  die
  32. Routine muβ also nur einmal pro Satellit aufgerufen werden.
  33.  
  34. CALC_DEZ_TIME:
  35. Berechnet aus Datum und Uhrzeit die entsprechende Dezimalzeit.
  36.  
  37. CALC_POSITION:
  38. Die eigentliche Berechnung der Bahnpunkte. Die Variablennamen
  39. wurden so gewählt, daβ sie möglichst selbsterklärend sind.
  40.  
  41. Ich  hoffe  die  Erklärungen  sind  ausreichend.  Falls  Probleme
  42. auftreten, so stehe ich für Rückfragen gerne zu Verfügung.
  43. Ansonsten wünsche ich viel Spaβ beim Programmieren.
  44.  
  45. 73 de Ecki, DC1EX @ DB0GV
  46.  
  47.  
  48.  
  49.  
  50. ' Sat-Routinen für Gfa-Basic 2.0
  51. '          DC1EX 1989
  52. '
  53. ' Quelle : Amsat DL 1/89, DJ1YQ
  54. '
  55. '
  56. DEFFN arccos(x)=PI/2-ATN(x/SQR(1-x*x))
  57. DEFFN arcsin(x)=ATN(x/SQR(1-x*x))
  58. '
  59. PROCEDURE init
  60.   az_sat=10         !Anzahl Satelliten
  61.   '
  62.   ' Array's für Keplerdaten
  63.   '
  64.   DIM sat$(az_sat),epoch_time(az_sat),inclination(az_sat)
  65.   DIM raan(az_sat),eccentricity(az_sat),arg_of_perigee(az_sat)
  66.   DIM mean_anomaly(az_sat),mean_motion(az_sat),decay_rate(az_sat)
  67.   DIM epoch_rev(az_sat),epoch_year(az_sat),offset(az_sat)
  68.   '
  69.   ' Array's für Zwischenergebnisse
  70.   '
  71.   DIM rev_time(az_sat),semi_major_axis(az_sat)
  72.   DIM delta_omega_ell(az_sat),et_day_per(az_sat)
  73.   DIM delta_omega_eb(az_sat)
  74.   DIM gsw(az_sat),eqx_per(az_sat),et_day_akt(az_sat)
  75.   DIM delta_umlauf(az_sat),omega_akt(az_sat)
  76.   DIM et_day_per_akt(az_sat),eqx_per_akt(az_sat)
  77.   '
  78.   ' Array's für Ergebnisse
  79.   '
  80.   DIM u_akt(az_sat),m_a_akt(az_sat),w_a(az_sat)
  81.   DIM r(az_sat),distance(az_sat),t0(az_sat)
  82.   DIM eqx(az_sat),ssp_b(az_sat),ssp_l(az_sat)
  83.   DIM elevation(az_sat),azimut(az_sat)
  84.   DIM qth_sat(az_sat)
  85.   '
  86.   ' Konstanten
  87.   '
  88.   erd_radius=6371
  89.   drehung_tag=360.985647
  90.   rad=PI/180
  91.   grad=180/PI
  92.   '
  93.   ' Geographische Länge und Breite des Qth's
  94.   '
  95.   l_qth=353.2
  96.   b_qth=51.6
  97.   '
  98.   ' Keplerdaten
  99.   '
  100.   sat$(1)="Oscar 13"
  101.   epoch_time(1)=88243.213934
  102.   inclination(1)=57.57
  103.   raan(1)=241.37
  104.   eccentricity(1)=0.65629
  105.   arg_of_perigee(1)=189.76
  106.   mean_anomaly(1)=145.226
  107.   mean_motion(1)=2.09702315
  108.   decay_rate(1)=0
  109.   epoch_rev(1)=161
  110. RETURN
  111. '
  112. ' Berechnung einiger Bahnkonstanten
  113. ' Aufruf nur einmal erforderlich
  114. '
  115. PROCEDURE start_sat(sat)
  116.   '
  117.   ' Umlaufzeit
  118.   '
  119.   rev_time(sat)=1440/mean_motion(sat)
  120.   '
  121.   ' Groβe Halbachse
  122.   '
  123.   semi_major_axis(sat)=(rev_time(sat)*rev_time(sat)*36.4085*1000000)^(1/3)
  124.   '
  125.   ' Drehung der Bahnellipse (Grad pro Umlauf)
  126.   '
  127.   delta_omega_ell(sat)=5*(5*COS((inclination(sat))*rad)^2-1)/((semi_major_axis(sat)/erd_radius)^(3.5)*(1-eccentricity(sat)^2)^2*mean_motion(sat))
  128.   '
  129.   ' Drehung der Bahnebene (Grad pro Umlauf)
  130.   '
  131.   delta_omega_eb(sat)=-9.98*COS(inclination(sat)*rad)/((semi_major_axis(sat)/erd_radius)^3.5*(1-eccentricity(sat)^2)^2*mean_motion(sat))
  132.   '
  133.   ' Referenz-perigäums-epoch-time
  134.   '
  135.   epoch_year(sat)=INT(epoch_time(sat)/1000)
  136.   et_day_per(sat)=epoch_time(sat)-epoch_year(sat)*1000-mean_anomaly(sat)/(360*mean_motion(sat))
  137.   '
  138.   ' Greenwich Stundenwinkel
  139.   '
  140.   offset(sat)=101
  141.   FOR i%=85 TO epoch_year(sat)-1
  142.     ADD offset(sat),365
  143.     IF (i% MOD 4)=0
  144.       INC offset(sat)
  145.     ENDIF
  146.   NEXT i%
  147.   '
  148.   days=offset(sat)+et_day_per(sat)
  149.   '  gsw(sat)=0.9972685185*INT(days)+drehung_tag*(days-INT(days))
  150.   gsw(sat)=0.985647*INT(days)+drehung_tag*(days-INT(days))
  151.   gsw(sat)=gsw(sat) MOD 360
  152.   '
  153.   ' Referenz-Äquatorcrossing
  154.   '
  155.   eqx_per(sat)=gsw(sat)-raan(sat)
  156.   '
  157. RETURN
  158. '
  159. ' Aktuelle Position des Satelliten
  160. '
  161. PROCEDURE calc_position(sat,dez_time)
  162.   '
  163.   ' Zuwachs an Umläufen
  164.   '
  165.   delta_umlauf(sat)=INT((dez_time-et_day_per(sat))*mean_motion(sat))
  166.   '
  167.   ' Zuwachs des Arg. of Perigee
  168.   '
  169.   omega_akt(sat)=arg_of_perigee(sat)+delta_omega_ell(sat)*delta_umlauf(sat)
  170.   '
  171.   ' Aktualisieren der Referenz Perigäums ET
  172.   '
  173.   et_day_per_akt(sat)=et_day_per(sat)+delta_umlauf(sat)/mean_motion(sat)
  174.   '
  175.   ' Aktualisieren des Referenz-EQX
  176.   '
  177.   eqx_per_akt(sat)=eqx_per(sat)+delta_umlauf(sat)*(drehung_tag/mean_motion(sat)-delta_omega_eb(sat))
  178.   eqx_per_akt(sat)=eqx_per_akt(sat) MOD 360
  179.   '
  180.   ' Aktueller Orbit
  181.   '
  182.   u_akt(sat)=epoch_rev(sat)+delta_umlauf(sat)
  183.   '
  184.   ' MA
  185.   '
  186.   t=(dez_time-et_day_per_akt(sat))*1440
  187.   m_a_akt(sat)=INT(256*t/rev_time(sat))
  188.   '
  189.   ' Wahre Anomalie
  190.   '
  191.   z=2*PI*t/rev_time(sat)
  192.   e_a=z
  193.   REPEAT
  194.     z3=(e_a-eccentricity(sat)*SIN(e_a)-z)/(1-eccentricity(sat)*COS(e_a))
  195.     SUB e_a,z3
  196.   UNTIL ABS(z3)<1.0E-07
  197.   w_a(sat)=PI
  198.   IF e_a<>PI
  199.     w_a(sat)=2*ATN(SQR((1+eccentricity(sat))/(1-eccentricity(sat)))*TAN(e_a/2))
  200.     IF e_a>=PI
  201.       w_a(sat)=2*PI+w_a(sat)
  202.     ENDIF
  203.   ENDIF
  204.   w_a(sat)=w_a(sat)*360/(2*PI)
  205.   '
  206.   ' Entfernung Sat-Geozentrum
  207.   '
  208.   r(sat)=semi_major_axis(sat)*(1-eccentricity(sat)^2)/(1+eccentricity(sat)*COS(w_a(sat)*rad))
  209.   '
  210.   ' Aussichtsweite
  211.   '
  212.   distance(sat)=erd_radius*ATN(SQR(r(sat)^2-erd_radius^2)/erd_radius)
  213.   '
  214.   ' Zeit Perigäum-EQX
  215.   '
  216.   e0=(eccentricity(sat)+COS(omega_akt(sat)*rad))/(1+eccentricity(sat)*COS(omega_akt(sat)*rad))
  217.   e0=FN arccos(e0)*grad
  218.   t0(sat)=(e0*rad-eccentricity(sat)*SIN(e0*rad))*rev_time(sat)/(2*PI)
  219.   '
  220.   ' EQX
  221.   '
  222.   eqx(sat)=eqx_per_akt(sat)+drehung_tag*t0(sat)/1440
  223.   '
  224.   ' Ssp.b
  225.   '
  226.   ssp_b(sat)=FN arcsin(SIN(inclination(sat)*rad)*SIN((omega_akt(sat)+w_a(sat))*rad))*grad
  227.   '
  228.   ' Ssp.l
  229.   '
  230.   IF (ssp_b(sat)<0 AND inclination(sat)<90) OR (ssp_b(sat)>=0 AND inclination(sat)>=90)
  231.     ssp_l(sat)=eqx(sat)+(t-t0(sat))/4+FN arccos(COS((omega_akt(sat)+w_a(sat))*rad)/COS(ssp_b(sat)*rad))*grad
  232.   ELSE
  233.     ssp_l(sat)=eqx(sat)+(t-t0(sat))/4-FN arccos(COS((omega_akt(sat)+w_a(sat))*rad)/COS(ssp_b(sat)*rad))*grad
  234.   ENDIF
  235.   ssp_l(sat)=ssp_l(sat) MOD 360
  236.   IF ssp_l(sat)<0
  237.     ADD ssp_l(sat),360
  238.   ENDIF
  239.   '
  240.   ' Elevation
  241.   '
  242.   sx=FN arccos((SIN(ssp_b(sat)*rad)*SIN(b_qth*rad)+COS(ssp_b(sat)*rad)*COS(b_qth*rad)*COS((ssp_l(sat)-l_qth)*rad)))
  243.   elevation(sat)=ATN((COS(sx)-erd_radius/r(sat))/SIN(sx))*grad
  244.   '
  245.   ' Azimut
  246.   '
  247.   azimut(sat)=FN arccos((SIN(ssp_b(sat)*rad)-SIN(b_qth*rad)*COS(sx))/(COS(b_qth*rad)*SIN(sx)))*grad
  248.   IF (ssp_l(sat)-l_qth)>=0 OR (ssp_l(sat)-l_qth)<-180
  249.     azimut(sat)=360-azimut(sat)
  250.   ENDIF
  251.   '
  252.   ' Entferung Qth-Sat
  253.   '
  254.   qth_sat(sat)=r(sat)*SIN(sx)/COS(elevation(sat)*rad)
  255. RETURN
  256. '
  257. ' Umrechnung von Datum und Uhrzeit in Dezimalzeit
  258. '
  259. PROCEDURE calc_dez_time(datum$,uhrzeit$)
  260.   LOCAL day,month,year
  261.   day=VAL(LEFT$(datum$,2))
  262.   month=VAL(MID$(datum$,4,2))
  263.   year=VAL(RIGHT$(datum$,2))
  264.   '
  265.   dez_time=INT(30.55*(month+2))-2*(INT(0.1*(month+7)))-91
  266.   IF month>2
  267.     IF (year MOD 4)=0
  268.       INC dez_time
  269.     ENDIF
  270.   ENDIF
  271.   ADD dez_time,day
  272.   '
  273.   ADD dez_time,VAL(LEFT$(uhrzeit$,2))/24
  274.   ADD dez_time,VAL(MID$(uhrzeit$,4,2))/1440
  275.   ADD dez_time,VAL(RIGHT$(uhrzeit$,2))/86400
  276. RETURN
  277.  
  278.